package com.szr.leex.po;

import java.io.Serializable;
import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.UpdateTimestamp;

import lombok.Data;

/**
 * 项目基础entity
 * 参考https://www.cnblogs.com/EasonJim/p/7835357.html
 * 在阿里巴巴的规范里所有的POJO类必须使用包装类型，而在本地变量推荐使用基本类型
 * Java语言提供了八种基本类型。六种数字类型（四个整数型，两个浮点型），一种字符类型，还有一种布尔型。
 1、整数：包括int、short、byte初始值为0，long初始值为0L。
 2、浮点型：float初始值为0.0f、double初始值为0.0d。
 3、字符：char初始值为'\u0000'，如果输出，在Console上是看不到效果的。
 4、布尔：boolean初始值为false
 5、String (or any object)：null
 基本型别	大小	最小值	最大值
 boolean	-----	-----	------
 char	16-bit	Unicode 0	Unicode 2^16-1
 byte	8-bit	-128	+127
 short	16-bit	-2^15	+2^15-1
 int	32-bit	-2^31	+2^31-1
 long	64-bit	-2^63	+2^63-1
 float	32-bit	IEEE754	IEEE754
 double	64-bit	IEEE754	IEEE754
 void

 注意：
 表格里的^代表的是次方。<br/>

 <b>Java采用unicode，2个字节来表示一个字符，1个字节等于8位<b/><br/>

 * Created by WangChen on 2018/8/22 11:36.
 */

@Data
@EntityListeners({BaseEntityEventListener.class})
// MappedSuperclass 是类级别注解，该注解没有任何参数，被该注解标注的类不会映射到数据库中单独的表，
// 但该类所拥有的属性都将映射到其子类的数据库表的列中。
@MappedSuperclass
public class BaseEntity implements Serializable{

    @Id
    // http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html
    @GeneratedValue(generator = "uuidGenerator")
    // Hibernate官方文档http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html
    // @GenericGenerator allows integration of any Hibernate org.hibernate.id.IdentifierGenerator implementation
    // Hibernate Generator机制https://www.ibm.com/developerworks/cn/java/j-lo-tablegenerator/index.html
    // @GenericGenerator中的strategy在org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory中注册，
    // 如:
    // register("uuid2", UUIDGenerator.class);
    // register("uuid", UUIDHexGenerator.class)
    // 也可以使用类名如org.hibernate.id.UUIDHexGenerator
    @GenericGenerator(name = "uuidGenerator", strategy = "uuid")
    @Column(length = 64)
    private String id; // primary key

    @Column(length = 64)
    private String creator;

    @Column(length = 64)
    private String updater;

    // https://lw900925.github.io/java/java8-newtime-api.html
//    @CreationTimestamp
    @Column(nullable=false)
    private LocalDateTime createTime;

//    @UpdateTimestamp
    private LocalDateTime updateTime;

    private String version = "1.0.0"; // 版本号

    // Boolean类型的变量，如果不赋值，默认是null，查询条件为 WHERE used is null
    // Boolean是包装类型(Wrapper Type)，初始值为null
    // 包装类型是引用类型(Reference Type)。除了基本类型以外的，都是引用类型。
    private Boolean used = true; // 是否可用

    @org.hibernate.annotations.Type(type = "yes_no")
    @Column(nullable = false)
    private Boolean deleted = false; // 是否删除

    // boolean类型的变量，如果不赋值，默认是false
    // boolean是基本类型(Primitive Types)，每个基本类型都有默认值，boolean的默认值是false
//    private boolean test1 = true;
//    private boolean test2 = false;
//    private boolean test3;

}
